// encoding utf-8
#ifndef __QyRenderLayer__
#define __QyRenderLayer__

#include <QtGlobal>
#include "QyRenderItemList.h"

namespace QyRender {

class Painter;

/*! \brief Слой с элементами. Используется для группировки элементов и установки порядка отрисовки.
    \ingroup RenderCore

    Рендер(см QyRender::Painter) рисует слои в порядке возрастания, используя параметр z(глубина).
    Т.е. слой с наибольшем параметром z будет отрисован последним, а с наименьшим первым, Это дает
    возможность нарисовать элементы в правильном порядке, с отключенным тестом глубины.

    Слои можно скрывать, запрещить выделять элементы на них.

    Каждый слой привязывается к рендеру. Слои непривязанные к рендеру отрисовки не подлежат (А как и
    рисовать без рендера?:-) ).

    Все параметры слоя автоматически считаются параметрами привязанных к нему объектов.

    О элементе привязанном к слою можно говорить как о элементе лежащем В данном слое или лежащем НА
    данном слое.
*/
class Layer {
public:
    //! Параметры слоя
    enum LayerFlags {
        Selectable  = 1 << 1, //!< Элементы привязанные к этому слою можно выделять
        Visible     = 1 << 2, //!< Отображать элементы привязанные к этому слою. Т.е. видим ли этот слой
        All         = Selectable|Visible //!< Элементы привязанные к этому слою можно выделять и отображать
    };
    explicit Layer( QyRender::Painter * painter = 0, const LayerFlags & flags = All,
        const qreal & z = 0.0 );
    virtual ~Layer();

    const QyRender::Painter * painter() const { return p_painter; } //!< Получить рендер к которому привязан слой
    QyRender::Layer::LayerFlags flags() const { return p_flags; } //!< Параметры слоя
    bool isSelectable() const { return p_flags & Selectable; } //!< Можно ли выделять элементы привязанные к слою
    bool isVisible() const { return p_flags & Visible; } //!< Видимость слоя
    qreal z() const { return p_z; } //!< глубина
    QyRender::ItemList & items() { return p_items; } //!< Список элементов привязанных к слою.
//     QyRender::ItemList & items() { return p_items; }

    void setPainter( QyRender::Painter * painter ); //!< Установить рендер для слоя
    void setFlags( const LayerFlags & flags ) { p_flags = flags; } //!< Установить флаги слоя
    void setZ( const qreal & z ); //!< Установить глубину. Если слой привязан к рендеру, то смена глубины приведет к пересортировке слоев

private:
    Painter * p_painter; // Рендер к которому привязан слой
    LayerFlags p_flags; // Параметры слоя
    qreal p_z; // глубина
    ItemList p_items; // элементы привязанные к слою

};

};

#endif//__QyRenderLayer__
